package lvm;

import java.util.ArrayList;
import java.util.HashMap;

import lvm.fonctions.eval.Expr;
import lvm.fonctions.prim.Primitive;
import lvm.fonctions.prim.fsubr.Fsubr;
import lvm.fonctions.prim.fsubr.Quote;
import lvm.fonctions.prim.subr.Car;
import lvm.fonctions.prim.subr.Cdr;
import lvm.fonctions.prim.subr.Subr;
import lvm.reader.Reader;
import lvm.struct.Nil;
import lvm.struct.Sexpr;
import lvm.struct.Symbole;
import lvm.view.runIhm;

public class Contexte {
	@Override
	public String toString() {
		return "Contexte [contexte=" + contexte + "]";
	}

	/**
	 * Général
	 */
	private static ArrayList<Contexte> listeContextes = new ArrayList<Contexte>();
	private static int idContexteCourant;
	
	
	/**
	 * Utile
	 */
	public static void initContexte(){
		Contexte.listeContextes.add(new Contexte());
		idContexteCourant = (listeContextes.size()-1);
	}
	
	public static Contexte getContexteCourant(){
		return listeContextes.get(idContexteCourant);
	}
	
	
	
	public void init(){
		XmlRead xmlread = new XmlRead();
	}

	/**
	 * Contexte
	 */
	private HashMap<String,Sexpr> contexte = new HashMap<String,Sexpr>();
	
	public Sexpr putVariable(String nom,Sexpr sexpr){
		return contexte.put(nom, sexpr);
	}
	
	public boolean existVariable(String nom){
		return contexte.containsKey(nom);
	}
	
	public Symbole getVaraibles(Symbole symbole){
		if(contexte.get(symbole.toString()) instanceof Symbole)
		return (Symbole) contexte.get(symbole.toString());
		return null;
	}
	
	public Primitive getPrimitive(Symbole symbole){
		if(contexte.get(symbole.toString()) instanceof Primitive)
		return (Primitive) contexte.get(symbole.toString());
		return null;
	}
	
	public Expr getExpr(Symbole symbole){
		if(contexte.get(symbole.toString()) instanceof Expr)
		return (Expr) contexte.get(symbole.toString());
		return null;
	}
	
	public HashMap<String, Sexpr> getContexte(){
		return new HashMap<String, Sexpr>(contexte);
	}
	
}
